package example

import (
	"fmt"
	"io"
	"log"
	"os"
)

func Case1() {
	fmt.Println("🎯文件读写操作")

	test1()
	test2()
	test3()

}

func test1() {
	fmt.Println("基础接口")

	// io.Reader 接口
	// type Reader interface {
	//     Read(p []byte) (n int, err error)
	// }

	// io.Writer 接口
	// type Writer interface {
	//     Write(p []byte) (n int, err error)
	// }

	// io.Closer 接口
	// type Closer interface {
	//     Close() error
	// }

	// io.Seeker 接口
	// type Seeker interface {
	//     Seek(offset int64, whence int) (int64, error)
	// }
	fmt.Println("核心接口: Reader, Writer, Closer, Seeker")

}

func test2() {
	fmt.Println("\n文件操作")

	// 创建文件
	file, err := os.Create("case1.txt")
	if err != nil {
		log.Println("文件创建失败，%v", err)
		return
	}
	defer file.Close()           //确保文件正常关闭
	defer os.Remove("case1.txt") //删除文件
	fmt.Println("\t文件创建成功")

	// 写入文件
	content := "hello，Go-IO文件操作.\n第二行内容"
	n, err := file.Write([]byte(content))
	if err != nil {
		log.Println("写入文件失败，%v", err)
	}
	fmt.Printf("\t写入 %d 字节\n", n)

	// 同步到磁盘
	file.Sync()

	// 读取文件
	// 打开文件进行读取
	file2, err := os.Open("case1.txt")
	if err != nil {
		log.Println("打开文件失败%v", err)
	}

	// 方式一：读取全部内容
	data1, err := io.ReadAll(file2)
	if err != nil {
		log.Println("读取文件失败%v", err)
	}
	fmt.Println("\t读取文件内容：", string(data1))

	//// 方式二：分块读取
	//file2.Seek(0, 0)           //重新定位到文件内容开头
	//buffer := make([]byte, 10) //10字节缓冲区
	//for {
	//	n, err := file2.Read(buffer)
	//	if err == io.EOF {
	//		fmt.Println("读取完成...")
	//		break
	//	}
	//	if err != nil {
	//		log.Println("读取错误：%v", err)
	//		break
	//	}
	//	fmt.Printf("\t读取 %d 字节: %q\n", n, string(buffer[:n]))
	//}
}

func test3() {
	fmt.Println("\n简化文件操作: 使用os.ReadFile和os.WriteFile简化操作")

	// 一次性写入文件
	err := os.WriteFile("case1Test3.txt", []byte("这是一次性写入的文件内容\n，第二行内容"), 0644)
	if err != nil {
		log.Println("写入文件失败%v", err)
		return
	}
	//defer os.Remove("case1Test3.txt") //删除文件

	// 一次性读取文件
	data, err := os.ReadFile("case1Test3.txt")
	if err != nil {
		log.Println("文件读取失败%v", err)
		return
	}
	fmt.Println("\t文件内容：", string(data))
}
